package classAndFunction;

public class Demo4 {
    public static void main(String[] args) {
        Demo4 demo4 = new Demo4();
//        demo4.print(5, 5, '*');
//        Person person = new Person();
//        person.age = 18;
//        person.name = "小白";
//        int num = 10;
//        System.out.println("执行方法前age："+person.age);
//        System.out.println("执行方法前name："+person.name);
//        System.out.println("执行方法前num："+num);
//        demo4.test1(person,num);
//        System.out.println("执行方法后age："+person.age);
//        System.out.println("执行方法后name："+person.name);
//        System.out.println("执行方法后num："+num);

//        System.out.println("5的阶乘="+ demo4.factorial(5));
//        System.out.println("7的斐波那契数="+ demo4.fibonacci(7));
//        System.out.println("第一天吃之前有几只桃子="+ demo4.monkeyEatsPeach(1));
//        demo4.test();
//        demo4.monkeyEatsPeach(1);
//        int[] nums = {1,2,3};
//        demo4.varParamsSum(1,2,3,4);
//        demo4.varParamsSum(nums);
//        demo4.showScore("小狗",278,135,145,149);

        //比较方法
        Person p1 = new Person("小明",18);
        Person p2 = new Person("小红",20);
        System.out.println("p1和p2的属性和值是否相等："+demo4.compareTo(p1,p2) );

    }
    /**
     * compareTo比较两个类，如果两个类的属性和值都一样返回true，否则返回false
     */
    public boolean compareTo(Person p1, Person p2){
        return p1.age == p2.age && p1.name.equals(p2.name);
    }

    /**
     * 可变参数，showScore
     * 有三个方法，分别实现返回姓名和两门课成绩(总分)，返回姓名和三门课成绩(总
     * 分），返回姓名和五门课成绩（总分）。封装成一个可变参数的方法
     */
    public void showScore(String name ,int... scores){
        int sum = 0;
        for(int i = 0; i < scores.length; i++){
            sum += scores[i];
        }
        System.out.println(name+"的总分是："+sum);
    }




    /**
     * 可变参数varParams
     * @param nums 可以看成是数组
     * @return
     */
    public int varParamsSum(int... nums){
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        System.out.println("可变参数的和为：" + sum);
        return sum;
    }

    /**
     * 猴子吃桃子问题：有一堆桃子，猴子第一天吃了其中的一半，并再多吃了一个！以后
     * 每天猴子都吃其中的一半，然后再多吃一个。当到第10天时，想再吃时（即还没吃）
     * 发现只有1个桃子了。问题：最初共多少个桃子？
     * function为第几天吃之前有几只桃子
     * f(10) = 1
     * f(10) = f(9)-(f(9)/2 + 1)
     *  f(10)     = f(9)-f(9)/2-1
     *        f(10) = f(9)/2 -1
     *        2f(10) = f(9) - 2
     *        -f(9) = -2f(10)-2
     *        f(9) = 2f(10)+2
     *        f(n) = 2f(n+1)+2
     *        f(9) = 2(f(10)+1)
     * 一共n个桃子
     * f(1) = n  【第一天吃之前有n个桃子】
     * f(2) = f(1)-(f(1)/2 + 1)【第二天吃之前有这么多】
     * f(3) = f(2)-(f(2)/2 + 1)【第三天吃之前有这么多】
     * f(n) = f(n-1)-(f(n-1)/2 + 1)【第n天吃之前有这么多】
     * f(n) = f(n-1)/2-1
     * f(n-1)/2 = f(n)+1
     * f(n-1) = 2f(n)+2
     * f(n) = 2f(n+1)+2
     * f(10) = 1
     * f(9) = 2*1 -2 = 0 个
     * 猴子吃桃子
     * f(10) = 1
     * 换个方法
     *
     */
    public int monkeyEatsPeach(int n){
        if(n==10){
            return 1;
        }
        if(n<10&&n>0){
            return 2*monkeyEatsPeach(n+1)+2;
        }
        return -1;
    }
    public void test(){
        for (int i = 10; i >= 1; i--) {
            System.out.println("第"+i+"天吃之前剩下"+monkeyEatsPeach(i)+"只桃子");

        }
    }


    /**
     * 请使用递归的方式求出斐波那契数1,1,2,3,5,8,13..给你一个整数n，求出它的值是多
     * 思路：
     *  f(1)=1 f(2) = 1
     *  f(3) = f(2)+f(1)
     *  当n>=3的时候 f(n) = f(n-1)+f(n-2)
     *  递归的退出值就是
     * @param n
     * @return
     */
    public int fibonacci (int n){
        if(n<=0){
            System.out.println("参数不正确");
            return -1;
        }
        if(n==1 || n ==2){
            return 1;
        }else {
            return fibonacci(n-1)+fibonacci(n-2);
        }
    }



    /**
     * 方法：
     * 参数：行 列 要打印的字符
     */
    public void print(int row, int col, char ch){
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                System.out.print(ch);
            }
            System.out.println();//换行
        }
    }
    /**
     * 基本数据类型和引用数据类型传参是否会改变原来的值
     */
    public void test1(Person person, int num){
        person.name = "小明";
        person.age = 20;
        num = 30;
        System.out.println("test1的person.age="+person.age);
        System.out.println("test1的person.name="+person.name);
        System.out.println("test1的num="+num);
        person = null;
        System.out.println("test1的person赋值为null之后="+person);
        person = new Person();
        person.age = 40;
        person.name = "小红";
    }

    /**
     * 阶乘计算，n的阶乘=(n-1)的阶乘*n
     * 1的阶乘=1
     * @param n
     */
    public int factorial(int n){
        if(n==1){
            return 1;
        }else {
            return factorial(n-1)*n;
        }
    }
}

class Person{
    String name;
    int age;
    public Person(){

    }
    //构造方法
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
}

